---
title: 泛化建模
sidebar_position: 0
---

泛化的建模、泛化的数据库设计以及泛化的代码实现。



<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241212004104.png"/>

## 聚合
聚合（aggregate） 是一组有整体部分关系，并且要满足一定不变规则的领域对象，其中只有一个实体表示整体，这个实体叫做聚合根。

聚合的整体与部分是强关联的，也就是一旦聚合根被删除，其它部分必然也被删除。由于这种强关系，所以外界只能通过聚合根来访问非根对象，因此，只有聚合根有业务意义上的全局标识，非聚合根实体只有局部标识。

对于那些单独存在，而不属于其他聚合的实体，可以认为是只有聚合根的、退化的聚合。

在模型图里，我们可以用 `<<aggreagte root>>` 衍型结合菱形符号标识聚合根，并且把聚合相关的实体以及专属于聚合的值对象放在一个包里。

不变规则，指的是每时每刻都不能打破的规则。如果可以暂时打破，后面再补救，就不算不变规则了。对于聚合整体上的不变规则，需要在聚合根或者聚合配合的领域服务中维护。

此外，我们还要考虑不变规则在并发的情况下被破坏的情况，这就要用事务把聚合的操作保护起来。所以，聚合决定了事务的最小边界。这种事务常常要用乐观锁或悲观锁来实现。


在编程上，非根实体的增删改，一般要由聚合根或者和聚合配合使用的工厂或者领域服务来负责，外部不能直接修改非聚合根。为了实现这一点，我们可以将非聚合根的构造器和 setter  设成包级四有权限。此外，聚合根返回非根实体的列表时，应该转换成不可变列表。

## 值对象

值对象（value object） 通常用来表示实体的属性值。